package com.pf.utils;

import java.util.List;
import java.util.function.Supplier;

/**
 * 先从redis缓存中获取，缓存中没有，可通过Supplier从数据库查询，然后将结果集保存至redis
 */
public class FromRedisOrDB {

    /**
     * 获取数据信息
     * <p>
     * 先从redis缓存中获取，缓存中没有，可通过Supplier从数据库查询，然后将结果集保存至redis
     *
     * @param cacheKey      缓存key
     * @param resultClazz   返回的数据类型
     * @param supplier      通过该对象可从数据库查询
     * @param keyExpireTime 缓存过期时间
     * @param <T>
     * @return
     */
    public static <T> T getObject(String cacheKey, Class<T> resultClazz, Supplier<T> supplier, long keyExpireTime) {
        if (RedisUtils.existsKey(cacheKey)) {
            return RedisUtils.get(cacheKey, resultClazz);
        }
        T data = supplier.get();
        if (data != null) {
            RedisUtils.set(cacheKey, data, keyExpireTime);
        }
        return data;
    }

    /**
     * 获取数据信息
     * <p>
     * 先从redis缓存中获取，缓存中没有，可通过Supplier从数据库查询，然后将结果集保存至redis
     *
     * @param cacheKey      缓存key
     * @param resultClazz   返回的数据类型
     * @param supplier      通过该对象可从数据库查询
     * @param keyExpireTime 缓存过期时间
     * @param <T>
     * @return
     */
    public static <T> List<T> getList(String cacheKey, Class<T> resultClazz, Supplier<T> supplier, long keyExpireTime) {
        if (RedisUtils.existsKey(cacheKey)) {
            return RedisUtils.getList(cacheKey, resultClazz);
        }
        List<T> data = (List<T>) supplier.get();
        if (data != null && !data.isEmpty()) {
            RedisUtils.set(cacheKey, data, keyExpireTime);
        }
        return data;
    }
}
